#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=1e6+5,M=5e5+5,INF=1e9,S=1e7;
bool Mst;
int n=1e6,q;
map<pair<int,int>,int>mp;
struct node{
	int l,r;
};
struct data{
	int ls,rs,val;
	int ma,mb,tag;
	int maxa;
}tr[S];
vector<node>par[M<<2];
int st[S],top,cnt;
node pst[M],qst[M],rst[M];//l->mal r->mir
int ptop;
inline int cre(){
	if(top)return st[top--];
	return ++cnt;
}
int rea[S],opb;
inline int clone(int p){
	int x=cre();
	rea[++opb]=x;
	tr[x]=tr[p];
	return x;
}
int curq;
void ins(int p,int l,int r,int x,int y,node v){
//	cerr<<l<<" "<<r<<" "<<x<<" "<<y<<" "<<v.l<<" "<<v.r<<"???\n";
	if(x<=l&&r<=y)return par[p].push_back(v),void();
	int mid=(l+r)>>1;
	if(x<=mid)ins(p<<1,l,mid,x,y,v);
	if(y>mid)ins(p<<1|1,mid+1,r,x,y,v);
}
struct HJ{
	#define ls(p) tr[p].ls
	#define rs(p) tr[p].rs
	inline void pu(int p){
		tr[p].val=min(tr[ls(p)].val,tr[rs(p)].val);
		tr[p].ma=min(tr[ls(p)].ma,tr[rs(p)].ma);
		tr[p].mb=max(tr[ls(p)].mb,tr[rs(p)].mb);
		tr[p].maxa=max(tr[ls(p)].maxa,tr[rs(p)].maxa);
	}
	inline void atag(int &p,int v){
		if(v==-1)return ;
		p=clone(p);
		tr[p].val=v-tr[p].mb+1;
		tr[p].ma=v;
		tr[p].tag=v;
		tr[p].maxa=v;
	}
	inline void pd(int &p){
		p=clone(p);
		if(~tr[p].tag){
			atag(ls(p),tr[p].tag);
			atag(rs(p),tr[p].tag);
			tr[p].tag=-1;
		}
	}
	void build(int &p,int l,int r){
		p=cre();
		tr[p].tag=-1;
		if(l==r){
			tr[p]={0,0,INF,INF,-INF,0,INF};
			return ;
		}
		int mid=(l+r)>>1;
		build(ls(p),l,mid),build(rs(p),mid+1,r);
		pu(p);
	}
	inline void updb(int &p,int l,int r,int x,int v){
		p=clone(p);
		if(l==r){
			tr[p].mb=max(tr[p].mb,v);
			tr[p].val=tr[p].ma-tr[p].mb+1;
			return ;
		}
		pd(p);
		int mid=(l+r)>>1;
		if(x<=mid)updb(ls(p),l,mid,x,v);
		else updb(rs(p),mid+1,r,x,v);
		pu(p);
	}
	int qryb(int &p,int l,int r,int x){
		if(l==r)return tr[p].mb;
		pd(p);
		int mid=(l+r)>>1;
		if(x<=mid)return qryb(ls(p),l,mid,x);
		return qryb(rs(p),mid+1,r,x);
	}
	int find(int &p,int l,int r,int x){
		if(tr[p].maxa<=x)return -1;
		if(l==r){
			if(tr[p].ma>x)return l;
			return -1;
		}
		pd(p);
		int mid=(l+r)>>1;
		if(tr[ls(p)].maxa<=x)return find(rs(p),mid+1,r,x);
		return find(ls(p),l,mid,x);
	}
	void upda(int &p,int l,int r,int x,int y,int v){
		if(x<=l&&r<=y)return atag(p,v);
		pd(p);
		int mid=(l+r)>>1;
		if(x<=mid)upda(ls(p),l,mid,x,y,v);
		if(y>mid)upda(rs(p),mid+1,r,x,y,v);
		pu(p);
	}
}T;
int ans[M];
int curl=0,curr=1e6,lma=0,rmi=1e6;
bool etop[M],cure;
int rt[M<<2];
void gans(int p,int l,int r){
	if(p^1)rt[p]=clone(rt[p>>1]);
	int las=ptop;
	int lasop=opb;
	for(auto v:par[p]){
		curq++;
		pst[++ptop]={curl,curr};
		qst[ptop]={lma,rmi};
		etop[ptop]=cure;
		if(v.l==v.r+1){
			cure=1;
		}
		if(v.l>curl){
			lma=v.r;
			curl=v.l;
		}
		else if(v.l==curl)lma=max(lma,v.r);
		if(v.r<curr){
			rmi=v.l;
			curr=v.r;
		}
		else if(v.r==curr)rmi=min(rmi,v.l);
		T.updb(rt[p],1,n,v.r,v.l);
		int x=T.find(rt[p],1,n,v.r);
		if(x!=-1&&x+1<=v.l){
			T.upda(rt[p],1,n,x,v.l-1,v.r);
		}
	}
	if(l==r){
		if(cure){
			ans[l]=1;
		}
		else if(curr==lma&&curl==rmi){
			ans[l]=curr-curl+1;
			
		}
		else if(curr>=curl){
			ans[l]=lma-rmi+1;
		}
		else{
			ans[l]=tr[rt[p]].val;
		}
	}
	else{
		int mid=(l+r)>>1;
		gans(p<<1,l,mid),gans(p<<1|1,mid+1,r);
	}
	while(ptop^las){
		curl=pst[ptop].l,curr=pst[ptop].r;
		lma=qst[ptop].l;rmi=qst[ptop].r;
		cure=etop[ptop];
		ptop--;
		curq--;
	}
	for(int i=lasop+1;i<=opb;i++)st[++top]=rea[i],tr[rea[i]]=tr[0];
	opb=lasop;
	return ;
}
bool Med;
int main(){
	cerr<<(&Mst-&Med)/1024.0/1024.0<<"\n";
	freopen("stone.in","r",stdin);
	freopen("stone.out","w",stdout);
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>q;
	tr[0].tag=-1;
	char op;int l,r;
	for(int i=1;i<=q;i++){
		cin>>op>>l>>r;
		r--;
		if(op=='A')mp[{l,r}]=i;
		else ins(1,1,q,mp[{l,r}],i-1,{l,r}),mp[{l,r}]=0;
	}
	for(auto v:mp){
		if(!v.second)continue;
		node p={v.first.first,v.first.second};
		ins(1,1,q,v.second,q,p);
	}
	T.build(rt[1],1,n);
	gans(1,1,q);
	for(int i=1;i<=q;i++)cout<<ans[i]<<"\n";
	cerr<<cnt<<"???\n";
	return 0;
}
